iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0

Abstract

Component為一個Spring中給許多模式註解進行聲明式配置的註解(Annotation)元件,我們稱之此種註解為元註解(Meta-Annotations),我們如何解釋援助解呢?假如一個註解可標註在其他註解上,我那我就是稱支元註解,如我們前面第二天所敘@Retention、@Documented、@Target及@Inherited皆是能夠作為任何註解的元註解,故任何一種繼承此模式的註解,皆有其專業的術語名稱描述之,我們如何去探討個模式如何繼承其註解及相關模式註解呢?我們將在架構部分做進一步的分析與介紹。

Principle Introduction

在Spring 框架中,如何透過去拆解各類型的Bean進而區分各類型的模式,皆是透過繼承元註解進行實例化各類型的服務,當服務啟動時會自動掃瞄專案中相關的元件(@Component)註解,並此元件實例化儲存於IoC元件配置池中,當開發者需要引用時,在自動地進行注入相對應的應用服務,所以我們可以得知無論是何種元件,皆可以透過Bean註解方式進行聲明式注入,我們將提供以下幾種範例程式碼進行闡述與分析,透過幾項範例提供讀者
進一步了解所有的元件與服務的應用。

  1. 針對繼承實例化物件進行聲明式註解配置此種元件為何種模式類型

1.1 配置元件(@Component)註解並定義註解名稱,Spring 框架會因一個介面有多個實例化元件類別導致IoC進行注入時產生衝突,此時須先判定哪個是首要的元件資源進行定義他的優先權(@Primary),或者,開發者透過@Qualifier註解方式尋找指定的Bean名稱,即可確實地注入該元件,如範例我們以ActorServiceImpl2為首要元件。

@Primary
@Component("ComponentChapter2")
public class ActorServiceImpl2 implements ActorService {
    @Override
    public JohnWickMovieActor getJohnWickMainActor() {
        JohnWickMovieActor johnWickMovieActor = new JohnWickMovieActor();
        johnWickMovieActor.setName("John Weisting")
                .setDescription("CEO of Killer")
                .setKillCounter(9999);
        return johnWickMovieActor;
    }

    @Override
    public JohnWickMovieActor getJohnWickHotelCEOActor() {
        JohnWickMovieActor johnWickMovieActor = new JohnWickMovieActor();
        johnWickMovieActor.setName("Winston Weisting")
                .setDescription("CEO of New York Continental Hotel ")
                .setKillCounter(0);
        return johnWickMovieActor;
    }

    @Override
    public JohnWickMovieActor getJohnWickHotelWaiterActor() {
        JohnWickMovieActor johnWickMovieActor = new JohnWickMovieActor();
        johnWickMovieActor.setName("Charon Weisting")
                .setDescription("Waiter of New York Continental Hotel ")
                .setKillCounter(77);
        return johnWickMovieActor;
    }
}

1.2 自動注入及實例化相對應的首要元件,並透過此種方式提供開發者進行邏輯判定

    @Autowired
    ActorService actorService2;
    
    @Test
    public void validateChapter2() {
        assertEquals(actorService2.getJohnWickMainActor().getName(),"John Weisting");
        System.out.println("Validate ActorServiceImpl Chapter 2 from Component success !");
    }

1.3 元件可重複透過Bean方式進行重新聲名式注入

    @Bean("Chapter-1")
    public ActorService getActorServiceChapter1() {
        return new ActorServiceImpl() {
            @Override
            public JohnWickMovieActor getJohnWickMainActor() {
                JohnWickMovieActor johnWickMovieActor = new JohnWickMovieActor();
                johnWickMovieActor.setName("John Wick2")
                        .setDescription("CEO of Killer")
                        .setKillCounter(9999);
                return johnWickMovieActor;
            }
        };
    }

    @Bean("Chapter-2")
    public ActorService getActorServicChapter2() {
        return new ActorServiceImpl2();
    }

透過以上幾項範例,提供讀者了解無論各種已進行過聲明式註解的元件類別,我們都可透過Bean註解方式重新進行聲明配置及重新實作該方法,已達到不同的場域應用,故我們可以得知可透過如果不知該元件如何分類,將可統一運用@Component進行歸類,進而提供不同的場域應用與解析。

Structure

此通用元件繼承了四項註解,分別為@Target、@Retention、@Documented及@Index,此四項註解適用於何種元件類別、何種環境下及何種模式的定義,將會依照各種類型註解類別進行配置與定義,四類註解類型定義敘述如下。

@Target : 此通用元件選擇ElementType.Type此種列舉類型,將代表適用於類別(Class)、介面(interface)及列舉(enum)三種Java類型檔案。
@Retention : 此通用元件選擇RetentionPolicy.RUNTIME此種列舉類型,編譯器會將此註解儲存於類別檔中,可由VM進行讀取,便可提供開發者進行獲取所有已註解通用元件的類別。
@Documented : 此註解代表會被javadoc工具紀錄處理,亦可被包括在生成在文檔中。
@Indexed : Spring 框架所提供的一種註解(Annotation),可作為一種代表此為原為模式註解(Annotation)所採用,以提升應用服務啟動性能。

image

圖一 Component 架構圖

根據此架構圖分析可看出,此通用元件可作為僅通用在各式類別元件的註解,不同用於個類別中的屬性及方法中,提供開發者快速了解此通用元件的適當置放位置及目的。

Follow up

Run test task

gradle test

Run open result html

open ./build/reports/tests/test/index.html

Test Report

測試結果,透過Bean進行Override Component依舊可進行覆蓋新結果,並達到預期目標
image

Sample Source

spring-component-sample

Reference Url

SpringBoot 註解最全詳解 -整合超詳細版本-

Spring @Component Annotation

Java注解之Retention、Documented、Target介绍

SpringFramework5.0 @Indexed註解 簡單解析


上一篇
[Day - 06 ] - Spring Conditional 運用與原理
下一篇
[Day - 08] - Spring 通用注入各式元件運作與設計
系列文
Wow ! There is no doubt about Learn Spring framework in a month.30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言